package com.xzzz.common.iaas;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;


/**
 * IAAS 配置项
 */
@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "xzzz.iaas")
public class IaasProperties {
    /**
     * 对象存储类型
     */
    private String osType;
    /**
     * 阿里 OSS 配置
     */
    private OSS oss;
    /**
     * 华为 OBS 配置
     */
    private OBS obs;
    /**
     * 腾讯 COS 配置
     */
    private COS cos;
    /**
     * 七牛 KODO 配置
     */
    private KODO kodo;
    /**
     * 阿里 SMS 配置
     */
    private SMS sms;

    /**
     * Ali OSS 配置
     */
    @Data
    public static class OSS {
        /**
         * oss endpoint
         */
        private String endpoint;
        /**
         * oss accessKeyId
         */
        private String accessKeyId;
        /**
         * oss accessKeySecret
         */
        private String secretAccessKey;
        /**
         * oss bucket名称
         */
        private String bucketName;
        /**
         * oss 的访问地址, 可以通过域名映射
         */
        private String domain;
        /**
         * oss 默认上传地址, 不填则默认上传至 bucket 根目录下, 以 / 结尾
         */
        private String defaultPath;
    }

    /**
     * 华为OBS配置
     */
    @Data
    public static class OBS {
        /**
         * obs endpoint
         */
        private String endpoint;
        /**
         * obs accessKeyId
         */
        private String accessKey;
        /**
         * obs secretKey
         */
        private String secretKey;
        /**
         * obs bucket名称
         */
        private String bucketName;
        /**
         * obs 的访问地址, 可以通过域名映射, 不要以 / 结尾
         */
        private String domain;
        /**
         * obs 默认上传地址, 不填则默认上传至 bucket 根目录下, 不要以 / 结尾
         */
        private String defaultPath;
    }

    /**
     * 腾讯COS配置
     */
    @Data
    public static class COS {
        /**
         * cos regionName
         */
        private String regionName;
        /**
         * cos accessKey
         */
        private String accessKey;
        /**
         * cos secretKey
         */
        private String secretKey;
        /**
         * cos bucket名称
         */
        private String bucketName;
        /**
         * cos 的访问地址, 可以通过域名映射, 不要以 / 结尾
         */
        private String domain;
        /**
         * cos 默认上传地址, 不填则默认上传至 bucket 根目录下, 不要以 / 结尾
         */
        private String defaultPath;
    }

    /**
     * 七牛KODO配置
     */
    @Data
    public static class KODO {
        // /**
        //  * kodo regionName
        //  */
        // private String regionName;
        /**
         * kodo accessKey
         */
        private String accessKey;
        /**
         * kodo secretKey
         */
        private String secretKey;
        /**
         * kodo bucket名称
         */
        private String bucketName;
        /**
         * kodo 的访问地址, 可以通过域名映射, 不要以 / 结尾
         */
        private String domain;
        /**
         * kodo 默认上传地址, 不填则默认上传至 bucket 根目录下, 不要以 / 结尾
         */
        private String defaultPath;
    }

    /**
     * Ali SMS 短信配置
     */
    @Data
    public static class SMS {
        private String sysDomain;
        private String sysAction;
        private String sysVersion;
        private String queryParamRegionId;
        /**
         * sms 短信消息的头部信息
         */
        private String queryParamSignName;
        private String accessKeyId;
        private String secret;
    }

    @PostConstruct
    public void init() {
        if (oss != null) {
            oss.setDomain(subSuffixSeparator(oss.getDomain()));
            oss.setDefaultPath(subSuffixSeparator(oss.getDefaultPath()));
        }
        if (obs != null) {
            obs.setDomain(subSuffixSeparator(obs.getDomain()));
            obs.setDefaultPath(subSuffixSeparator(obs.getDefaultPath()));
        }
        if (cos != null) {
            cos.setDomain(subSuffixSeparator(cos.getDomain()));
            cos.setDefaultPath(subSuffixSeparator(cos.getDefaultPath()));
        }
        if (kodo != null) {
            kodo.setDomain(subSuffixSeparator(kodo.getDomain()));
            kodo.setDefaultPath(subSuffixSeparator(kodo.getDefaultPath()));
        }
    }

    private String subSuffixSeparator(String str) {
        if (StrUtil.isNotBlank(str) && StrUtil.endWith(str, "/")) {
            return str.substring(0, str.length() - 1);
        }
        return str;
    }

}
